[求]手机号码和固话号码正则表达式

来源:百度知道 编辑:UC知道 时间:2024/05/21 04:22:35
要求是,输入正确手机或固话都能通过验证
支持长途,手机号码前可加0。固话可带区号

现在是这样写的
手机部分:^0?1[358]\d{9}$
固话部分:^(0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7}$
然后用或符号“|”连接起来
^(0?1[358]\d{9})|((0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7})$

用错误的号码测试 123456789012
单独用手机部分测试,得到号码非法
单独用固话部分测试,得到号码非法
但是用连接起来的表达式测试,居然能通过

为什么 ???

解释此现象给100分

再求一能解决此问题的正则,再追加100分

明白楼主的意思了,单独使用手机部分和固话部分的正则,得到号码非法,也就是说正则判断正确!

使用连接起来的表达式,号码通过。原因:"|"连接符;由于此连接符优先级最低,所以它将连接后的表达式分为两个部分

^(0?1[358]\d{9}) 和 ((0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7})$

导致了连接后的表达表达意思错误,解决方法有两种:

^(0?1[358]\d{9})$|^((0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7})$
或者
^((0?1[358]\d{9})|((0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7}))$

也就是在^和$中间加一对括号。

================

还有不明白的,可以发Hi消息。

这是什么来的,看不懂,帮你顶上去....

8383463回答的有道理,学习了

^(0?1[358]\d{9})|^((0(10|2[1-3]|[3-9]\d{2}))?[1-9]\d{6,7})$
他是迭代匹配的。